home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / SMISC.C < prev    next >
C/C++ Source or Header  |  1990-02-06  |  4KB  |  193 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8. #include "remote.h"
  9.  
  10. static struct tcb *disc_tcb,*echo_tcb;
  11. static struct socket remsock;
  12.  
  13. /* Start up discard server */
  14. dis1(argc,argv)
  15. int argc;
  16. char *argv[];
  17. {
  18.     struct socket lsocket;
  19.     void disc_recv(),misc_state();
  20.     char tos = 0;
  21.  
  22.     lsocket.address = ip_addr;
  23.     if(argc < 2)
  24.         lsocket.port = DISCARD_PORT;
  25.     else {
  26.         if ((lsocket.port = atoi(argv[1])) == 0)
  27.             lsocket.port = DISCARD_PORT;
  28.         tos = get_tos(argv[2]);
  29.     }
  30.     disc_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,disc_recv,NULLVFP,misc_state,tos,(char *)NULL);
  31.     return 0;
  32. }
  33. /* Start echo server */
  34. echo1(argc,argv)
  35. int argc;
  36. char *argv[];
  37. {
  38.     void echo_recv(),echo_trans(),misc_state();
  39.     struct socket lsocket;
  40.     char tos = 0;
  41.  
  42.     lsocket.address = ip_addr;
  43.     if(argc < 2)
  44.         lsocket.port = ECHO_PORT;
  45.     else {
  46.         if ((lsocket.port = atoi(argv[1])) == 0)
  47.             lsocket.port = ECHO_PORT;
  48.         tos = get_tos(argv[2]);
  49.     }
  50.     echo_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,echo_recv,echo_trans,misc_state,tos,(char *)NULL);
  51.     return 0;
  52. }
  53.  
  54. /* Start remote exit/reboot server */
  55. rem1(argc,argv)
  56. int argc;
  57. char *argv[];
  58. {
  59.     void uremote();
  60.  
  61.     remsock.address = ip_addr;
  62.     if(argc < 2)
  63.         remsock.port = REMOTE_PORT;
  64.     else
  65.         remsock.port = atoi(argv[1]);
  66.     open_udp(&remsock,uremote);
  67.     return 0;
  68. }
  69.  
  70. /* Shut down miscellaneous servers */
  71. dis0()
  72. {
  73.     if(disc_tcb != NULLTCB)
  74.         close_tcp(disc_tcb);
  75.     return 0;
  76. }
  77. echo0()
  78. {
  79.     if(echo_tcb != NULLTCB)
  80.         close_tcp(echo_tcb);
  81.     return 0;
  82. }
  83. rem0()
  84. {
  85.     del_udp(&remsock);
  86.     return 0;
  87. }
  88. /* Discard server receiver upcall */
  89. static
  90. void
  91. disc_recv(tcb,cnt)
  92. struct tcb *tcb;
  93. int16 cnt;
  94. {
  95.     struct mbuf *bp;
  96.  
  97.     if(recv_tcp(tcb,&bp,cnt) > 0)
  98.         free_p(bp);            /* Discard */
  99. }
  100.  
  101. /* Echo server receive
  102.  * Copies only as much will fit on the transmit queue
  103.  */
  104. static
  105. void
  106. echo_recv(tcb,cnt)
  107. struct tcb *tcb;
  108. int cnt;
  109. {
  110.     struct mbuf *bp;
  111.     int acnt;
  112.  
  113.     if(cnt == 0){
  114.         close_tcp(tcb);
  115.         return;
  116.     }
  117.     acnt = min(cnt,tcb->snd.wnd);
  118.     if(acnt > 0){
  119.         /* Get only as much will fit in the send window */
  120.         recv_tcp(tcb,&bp,tcb->snd.wnd);
  121.         send_tcp(tcb,bp);
  122.     }
  123. }
  124. /* Echo server transmit
  125.  * Copies anything that might have been left in the receiver queue
  126.  */
  127. static
  128. void
  129. echo_trans(tcb,cnt)
  130. struct tcb *tcb;
  131. int16 cnt;
  132. {
  133.     struct mbuf *bp;
  134.  
  135.     if(tcb->rcvcnt > 0){
  136.         /* Get only as much will fit in the send window */
  137.         recv_tcp(tcb,&bp,cnt);
  138.         send_tcp(tcb,bp);
  139.     }
  140. }
  141.  
  142. /* Log connection state changes; also respond to remote closes */
  143. static
  144. void
  145. misc_state(tcb,old,new)
  146. register struct tcb *tcb;
  147. char old,new;
  148. {
  149.     switch(new){
  150.     case ESTABLISHED:
  151.         log_tcp(tcb,"open %d",tcb->conn.local.port);
  152.         break;
  153.     case CLOSE_WAIT:
  154.         close_tcp(tcb);
  155.         break;
  156.     case CLOSED:
  157.         log_tcp(tcb,"close %d",tcb->conn.local.port);
  158.         del_tcp(tcb);
  159.         /* Clean up if server is being shut down */
  160.         if(tcb == disc_tcb)
  161.             disc_tcb = NULLTCB;
  162.         else if(tcb == echo_tcb)
  163.             echo_tcb = NULLTCB;
  164.         break;
  165.     }
  166. }
  167. /* Process remote exit/reset command */
  168. void
  169. uremote(sock,cnt)
  170. struct socket *sock;
  171. int16 cnt;
  172. {
  173.     struct mbuf *bp;
  174.     struct socket fsock;
  175.     char command;
  176.  
  177.     recv_udp(sock,&fsock,&bp);
  178.     command = pullchar(&bp);
  179.     switch(uchar(command)){
  180. #if (defined(MSDOS) || defined(ATARI_ST))
  181.     case SYS_RESET:
  182.         log_msg("%s - REMOTE RESET",psocket(&fsock));
  183.         doexit(-1);
  184.         sysreset();
  185.         break;    /* Not necessary */
  186. #endif
  187.     case SYS_EXIT:
  188.         log_msg("%s - REMOTE EXIT",psocket(&fsock));
  189.         doexit(0);
  190.         break;
  191.     }
  192. }
  193.